package com.ywd.platform.websocket.handler;

import cn.hutool.core.collection.CollectionUtil;
import com.google.gson.Gson;
import com.ywd.platform.exception.R;
import com.ywd.platform.service.impl.VehicleTrackRecordServiceImpl;
import com.ywd.platform.vo.VehicleTrackRecordOutVo;
import com.ywd.platform.websocket.sender.WebSocketMessageSender;
import com.ywd.platform.websocket.session.WebSocketSessionManager;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;
import java.util.List;

/**
 * WebSocket 消息处理器
 * 继承TextWebSocketHandler，处理文本类型的WebSocket消息（如JSON/普通文本）
 * 负责连接建立、关闭事件和消息路由逻辑
 */
@Slf4j
@Component
@AllArgsConstructor
public class MessageWebSocketHandler extends TextWebSocketHandler {

    // 自定义会话管理器（维护在线连接）
    private final WebSocketSessionManager webSocketSessionManager;
    private final VehicleTrackRecordServiceImpl vehicleTrackRecordServiceImpl;
    private final WebSocketMessageSender webSocketMessageSender;
    private final Gson gson = new Gson();
    /**
     * 连接建立成功时触发
     * @param session 当前连接的WebSocket会话对象
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        // 将会话加入管理器（通常存储用户ID与Session的映射）
        webSocketSessionManager.addSession(session);
        //log.debug("New connection established: {}", session.getId());
    }

    /**
     * 连接关闭时触发（包括主动关闭或网络异常）
     * @param session 关闭的会话对象
     * @param status  关闭状态码及原因（如1000=正常关闭）
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        // 从管理器移除会话（避免内存泄漏）
        webSocketSessionManager.removeSession(session);
        //log.debug("Connection closed: {}, status: {}", session.getId(), status);
    }

    /**
     * 处理收到的文本消息
     * @param session 发送消息的会话对象
     * @param message 包含消息内容和属性（如payload）
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        log.info("会话ID: {}: 消息: {}", session.getId(), payload);
        // 1. 构造标准文本消息（JSON格式）
        R<Object> result = R.ok(null);
        List<VehicleTrackRecordOutVo> list = vehicleTrackRecordServiceImpl.getVehicleTrackRecordList();
        if(CollectionUtil.isNotEmpty(list)) {
            result = R.ok(list);
        }
        // 2. 发送消息（同步方式）
        try {
            session.sendMessage(new TextMessage(gson.toJson(result)));
            log.info("消息已发送至会话 {}: {}", session.getId(), list);
        } catch (IOException e) {
            log.error("发送消息失败", e);
            throw new RuntimeException("消息发送失败", e);
        }
        // 3. 异步发送示例（高性能场景）
        // session.getAsyncRemote().sendText(responseJson);
    }


}
